package net.lab1024.sa.base.utils;

import java.lang.reflect.Field;

/**
        * 反射工具类，用于通过属性名获取实体类的属性值（包括父类继承的属性）
        */
public class ReflectionUtil {

    /**
            * 通过属性名获取实体类的属性值（包括父类继承的属性）
            *
            * @param object    实体类对象
     * @param fieldName 属性名称
     * @return 属性值，如果属性不存在或发生异常则返回 null 或空字符串
     */
    public static String getFieldValue(Object object, String fieldName) {
        try {
            // 1. 获取对象的 Class
            Class<?> clazz = object.getClass(); // 修正：使用 getClass() 而不是 getClasses()

            // 2. 递归查找属性（支持继承链）
            Field field = findField(clazz, fieldName);

            // 3. 设置可访问（避免 private 导致错误）
            if (field != null) {
                field.setAccessible(true);
                Object o = field.get(object);
                if (o != null) {
                    return field.get(object).toString();
                }
                return "";
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
            * 递归查找属性（包括父类）
            *
            * @param clazz     当前类
     * @param fieldName 要查找的属性名称
     * @return 找到的 Field 对象，如果未找到则返回 null
            */
    private static Field findField(Class<?> clazz, String fieldName) {
        while (clazz != null) {
            try {
                return clazz.getDeclaredField(fieldName);
            } catch (NoSuchFieldException e) {
                clazz = clazz.getSuperclass(); // 继续向父类查找
            }
        }
        return null;
    }
}